/**
 * 版权所有(C)，上海勾芒信息科技，2017，所有权利保留。
 * 
 * 项目名：	cards-web
 * 文件名：	WxAppContext.java
 * 模块说明：	
 * 修改历史：
 * 2017年4月12日 - Debenson - 创建。
 */
package com.alex.wechat.app.config;

import java.util.Map;

import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;
import org.jeecgframework.core.util.ApplicationContextUtil;
import org.jeecgframework.core.util.ContextHolderUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alex.wechat.app.account.entity.WxAppAccountEntity;
import com.alex.wechat.app.account.service.WxAppAccountServiceI;
import com.alex.wechat.app.config.ThirdSessionCache.ThirdSession;
import com.google.common.collect.Maps;

/**
 * 小程序环境。
 * 
 * @author Debenson
 * @since 0.1
 */
public class WxAppContext {
  static final Logger logger = LoggerFactory.getLogger(WxAppContext.class);

  /** 小程序的appid */
  public static final String KEY_WXAPP_APP_ID = "__WEAPP_APP_ID__";
  /** 小程序的原始ID */
  private static final String KEY_WXAPP_ORIGINAL_ID = "__WXAPP_ORIGINAL_ID__";
  /** 第三方session key */
  public static final String KEY_THIRD_SESSION_KEY = "thirdSessionKey";

  private static final ThreadLocal<Map<String, Object>> tl = new ThreadLocal<Map<String, Object>>() {

    protected java.util.Map<String, Object> initialValue() {
      return Maps.newHashMap();
    };

  };

  public static void clear() {
    tl.remove();
  }

  private static void put(String key, String value) {
    tl.get().put(key, value);
    HttpSession session = ContextHolderUtils.getSession();
    if (session != null) {
      session.setAttribute(key, value);
    }
  }

  private static Object get(String key) {
    Object value = null;
    HttpSession session = ContextHolderUtils.getSession();
    if (session != null) {
      value = session.getAttribute(key);
    }
//
//    if (value == null) {
//      value = tl.get().get(key);
//    }

    return value;
  }

  /**
   * 设置小程序Appid
   * 
   * @param appId
   */
  public static void setAppId(String appId) {
    put(KEY_WXAPP_APP_ID, appId);
  }

  /**
   * 设置小程序的原始Id.
   * 
   * @param originalId
   */
  public static void setOriginalId(String originalId) {
    put(KEY_WXAPP_ORIGINAL_ID, originalId);
  }

  /**
   * 设置第三方session key
   * 
   * @param thirdSessionKey
   */
  public static void setThirdSessionKey(String thirdSessionKey) {
    put(KEY_THIRD_SESSION_KEY, thirdSessionKey);
  }

  /**
   * 取得第三方session key
   * 
   * @return
   */
  public static String getThirdSessionKey() {
    return (String) get(KEY_THIRD_SESSION_KEY);
  }

  /**
   * 取得小程序客户端的第三方session
   * 
   * @return
   */
  public static ThirdSession getThirdSession() {
    String thirdSessionKey = getThirdSessionKey();
    if (StringUtils.isBlank(thirdSessionKey)) {
      return null;
    } else {
      return ThirdSessionCache.get(thirdSessionKey);
    }
  }

  /**
   * 取得小程序Appid
   * 
   * @return
   */
  public static String getAppId() {
    WxAppAccountEntity account = getAppAccount();
    if (account == null) {
      return null;
    } else {
      return account.getAppId();
    }
  }

  /**
   * 取得小程序原始id
   * 
   * @return
   */
  public static String getOriginalId() {
    WxAppAccountEntity account = getAppAccount();
    if (account == null) {
      return null;
    } else {
      return account.getOriginalId();
    }
  }

  /**
   * 取得当前会话的微信账户信息。
   * 
   * @return
   */
  public static WxAppAccountEntity getAppAccount() {
    WxAppAccountServiceI wxAppAccountService = ApplicationContextUtil
        .getBean(WxAppAccountServiceI.class);

    // 通过Appid查找
    String appId = (String) get(KEY_WXAPP_APP_ID);
    if (StringUtils.isNotBlank(appId)) {
      return wxAppAccountService.getAccountByAppId(appId);
    }

    // 再通过原始ID查找
    String originalId = (String) get(KEY_WXAPP_ORIGINAL_ID);
    if (StringUtils.isNotBlank(originalId)) {
      return wxAppAccountService.getAccountByOriginalId(originalId);
    }

    // 通过第三方session id取得open id，再取得小程序账户
    String thirdSessionKey = getThirdSessionKey();
    if (StringUtils.isNotBlank(thirdSessionKey)) {
      ThirdSession thirdSession = ThirdSessionCache.get(thirdSessionKey);
      if (thirdSession != null) {
        return wxAppAccountService.getAccountByAppId(thirdSession.getAppId());
      }
    }

    return null;
  }

}
